package com.bugman.business.impl;

import com.bugman.business.ProjectService;
import com.bugman.dao.Dao;
import com.bugman.entity.Project;
import com.bugman.entity.User;
import com.bugman.exceptions.ProjectAlreadyExistException;
import java.util.Date;
import java.util.List;
import javax.annotation.security.RolesAllowed;
import javax.ejb.EJB;
import javax.ejb.Stateless;

/**
 *
 * @author Flashman
 */
@Stateless
public class ProjectServiceBean extends BaseServiceBean implements ProjectService {

    @EJB
    Dao dao;

    /**
     * Vytvoří projekt v databázi podle objektu daného parametrem <b>project</b>, 
     * provede kontrolu zda již projekt se stejným názvem neexistuje.
     *
     *
     * @param project                           ukládaný projekt
     * @throws ProjectAlreadyExistException     Pokud projekt s tímto názvem již
     *                                          existuje, je vyhozena vyjímka
     */
    @RolesAllowed({"Developer", "Admin"})
    public void createProject(Project project) throws ProjectAlreadyExistException {
        if (projectExist(project.getName())) {
            throw new ProjectAlreadyExistException();
        }
        project.setCreationTime(new Date());
        dao.persist(project);
    }

    /**
     * Smaže projekt z databáze.
     *
     * @param project   mazaný projekt
     */
    @RolesAllowed({"Developer", "Admin"})
    public void deleteProject(Project project) {
        dao.remove(project);
    }

    /**
     * Změní projekt v databázi podle stávajícího objektu projekt v session.
     *
     * @param project           měněný projekt
     */
    @RolesAllowed({"Developer", "Admin"})
    public void updateProject(Project project) {
        dao.merge(project);
    }

    /**
     * Vrací projekt podle jeho ID.
     *
     * @param projectId     ID projektu v databázi
     * @return Project      hledaný projekt
     */
    public Project getProject(Integer projectId) {
        return dao.getProject(projectId);
    }

    /**
     * Vrací seznam všech projektů.
     *
     * @return List<Project>    seznam všech projektů
     */
    public List<Project> getAllProjects() {
        //TODO v0.2 for Flashman: sort list
        return dao.getAllProjects();
    }

    /**
     * Vrací nejaktivnější projekty podle nejnovějších bugů.
     *
     * @param count             počet nejaktivnějšcíh projketů
     * @return List<Project>    seznam projektů
     */
    public List<Project> getMostActiveProjects(Integer count) {
        return dao.getMostActiveProjects(count);
    }

    /**
     * Kontroluje, zda-li projekt existuje již v databázi.
     *
     * @param projectName   název projektu, který hledáme
     * @return true         když projekt existuje v databázi
     */
    public boolean projectExist(String projectName) {
        return (dao.getProject(projectName) != null);
    }

    /**
     * Vrací projekty, které daný uživatel vlastní či nevlastní
     *
     * @param developer         vlastník (nevlastník) projektů
     * @param owned             příznak, zda-li hledáme projekty, které uživatel vlastní či nevlastní
     * @return List<Project>    seznam projektů
     */
    @RolesAllowed({"Developer", "Admin"})
    public List<Project> getOwnedProjects(User developer, boolean owned) {
        if (owned) {
            return dao.getOwnedProjects(developer);
        } else {
            return dao.getNotOwnedProjects(developer);
        }
    }
}
